/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.presentacion.producto;

import com.mindbox.mueblesalpes.negocio.entity.Color;
import com.mindbox.mueblesalpes.negocio.entity.Dimension;
import com.mindbox.mueblesalpes.negocio.entity.Mueble;
import com.mindbox.mueblesalpes.negocio.entity.TipoMueble;
import com.mindbox.mueblesalpes.negocio.exception.TiendaException;
import com.mindbox.mueblesalpes.negocio.producto.IProductoService;
import com.mindbox.mueblesalpes.presentacion.utils.Mensajes;
import com.mindbox.mueblesalpes.presentacion.utils.UtilidadesImages;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.richfaces.model.UploadItem;

/**
 * Backing Bean asociado a /producto/edit.xhtml
 * @author Catalina Soto Zuluaga
 */
public class ProductoEditBean {

    private static String LIST = "list";

    private String referencia;
    private String nombre;
    private String descripcion;
    private String tipo;
    private String material;
    private Dimension dimension;
    private Double alto;
    private Double ancho;
    private Double profundidad;
    private String color;
    private Double peso;
    private String nombreFoto;
    private byte[] bytesFoto;
    private List<UploadItem> foto;
    private UploadItem fotoMueble;
    private List<SelectItem> colorItems = new ArrayList<SelectItem>();

    @EJB
    private IProductoService productoService;

    /** Creates a new instance of ProductoEditBean */
    public ProductoEditBean() {
        foto = new ArrayList<UploadItem>();
        FacesContext facescontext = FacesContext.getCurrentInstance();
        Mueble mueble = (Mueble) facescontext.getExternalContext().getSessionMap().get("MuebleEdit");
        if (mueble != null) {
            inicializarDatos(mueble);
            cargarColores();
        }
    }

    /**
     * Método que permite cargar en un seletItem los colores
     */
    private void cargarColores() {
        SelectItem item1 = new SelectItem(Color.AMARILLO);
        SelectItem item2 = new SelectItem(Color.AVELLANA);
        SelectItem item3 = new SelectItem(Color.AZUL);
        SelectItem item4 = new SelectItem(Color.CAOBA);
        SelectItem item5 = new SelectItem(Color.MADERA);
        SelectItem item6 = new SelectItem(Color.MADERA);
        SelectItem item7 = new SelectItem(Color.NARANJA);
        SelectItem item8 = new SelectItem(Color.NATURAL);
        SelectItem item9 = new SelectItem(Color.ROJO);
        SelectItem item10 = new SelectItem(Color.WENGUE);

        getColorItems().add(item1);
        getColorItems().add(item2);
        getColorItems().add(item3);
        getColorItems().add(item4);
        getColorItems().add(item5);
        getColorItems().add(item6);
        getColorItems().add(item7);
        getColorItems().add(item8);
        getColorItems().add(item9);
        getColorItems().add(item10);
    }

    /**
     * Método que carga los datos del mueble que se va a editar
     * @param mueble
     */
    private void inicializarDatos(Mueble mueble) {
        setReferencia(mueble.getReferencia());
        setNombre(mueble.getNombre());
        setDescripcion(mueble.getDescripcion());
        setTipo(mueble.getTipoMueble().toString());
        setMaterial(mueble.getMaterial());
        setDimension(mueble.getDimension());
        setBytesFoto(mueble.getBytesFoto());
        setColor(mueble.getColor().toString());
        setNombreFoto(mueble.getFoto());

        if(mueble.getBytesFoto() != null && mueble.getFoto() != null){
            List<Mueble> muebles = new ArrayList<Mueble>();
            muebles.add(mueble);
            UtilidadesImages.agregarFotos(FacesContext.getCurrentInstance(), UtilidadesImages.getBeanImageFromMuebles(muebles));
        }

        if (getDimension().getAlto() != null) {
            setAlto(getDimension().getAlto());
        }
        if (getDimension().getAncho() != null) {
            setAncho(getDimension().getAncho());
        }
        if (getDimension().getProfundidad() != null) {
            setProfundidad(getDimension().getProfundidad());
        }
        if (mueble.getPeso() != null) {
            setPeso(mueble.getPeso());
        }
    }

    /**
     * Método que permite editar un mueble en el sistema
     * @return Regla de navegación
     */
    public String editar() {
        try {
            Mueble mueble = new Mueble();
            mueble.setReferencia(getReferencia());
            mueble.setNombre(getNombre());
            mueble.setDescripcion(getDescripcion());
            Dimension dim = new Dimension();
            dim.setAlto(getAlto());
            dim.setAncho(getAncho());
            dim.setProfundidad(getProfundidad());
            mueble.setDimension(dim);
            mueble.setColor(obtenerColor(getColor()));
            mueble.setMaterial(getMaterial());
            mueble.setPeso(getPeso());
            
            if(getTipo().equals(TipoMueble.EXTERIOR.toString())){
                mueble.setTipoMueble(TipoMueble.EXTERIOR);
            }else if(getTipo().equals(TipoMueble.INTERIOR.toString())){
                mueble.setTipoMueble(TipoMueble.INTERIOR);
            }           
                
            if(getFoto().size() != 0){
                setFotoMueble(getFoto().iterator().next());
                mueble.setFoto(getReferencia());
                mueble.setBytesFoto(getFotoMueble().getData());
            }else {
                mueble.setFoto(getReferencia());
                mueble.setBytesFoto(getBytesFoto());
            }

            getProductoService().editarProducto(mueble);
            if(mueble.getBytesFoto() != null && mueble.getFoto() != null){
                nombreFoto = mueble.getFoto();
                List<Mueble> muebles = new ArrayList<Mueble>();
                muebles.add(mueble);
                UtilidadesImages.agregarFotos(FacesContext.getCurrentInstance(), UtilidadesImages.getBeanImageFromMuebles(muebles));
            }
            Mensajes.asignarMensajeInfo("edit.exitoso");
        } catch (TiendaException e) {
            Mensajes.asignarMensajeError(e.getMessage());
        } catch (Exception e) {
            Mensajes.asignarMensajeError("edit.error");
        }
        return getLIST();
    }

    /**
     * Método que obtiene un color a partir de la caden
     * @param color
     * @return Color
     */
    private Color obtenerColor(String color){
        if(color.equals(Color.AMARILLO.toString())){
            return Color.AMARILLO;
        }else if(color.equals(Color.AVELLANA.toString())){
            return Color.AVELLANA;
        }else if(color.equals(Color.AZUL.toString())){
            return Color.AZUL;
        }else if(color.equals(Color.CAOBA.toString())){
            return Color.CAOBA;
        }else if(color.equals(Color.MADERA.toString())){
            return Color.MADERA;
        }else if(color.equals(Color.NARANJA.toString())){
            return Color.NARANJA;
        }else if(color.equals(Color.NATURAL.toString())){
            return Color.NATURAL;
        }else if(color.equals(Color.ROJO.toString())){
            return Color.ROJO;
        }else if(color.equals(Color.WENGUE.toString())){
            return Color.WENGUE;
        }
        return Color.NATURAL;
    }

    /**
     * @return the referencia
     */
    public String getReferencia() {
        return referencia;
    }

    /**
     * @param referencia the referencia to set
     */
    public void setReferencia(String referencia) {
        this.referencia = referencia;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the tipo
     */
    public String getTipo() {
        return tipo;
    }

    /**
     * @param tipo the tipo to set
     */
    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    /**
     * @return the material
     */
    public String getMaterial() {
        return material;
    }

    /**
     * @param material the material to set
     */
    public void setMaterial(String material) {
        this.material = material;
    }

    /**
     * @return the dimension
     */
    public Dimension getDimension() {
        return dimension;
    }

    /**
     * @param dimension the dimension to set
     */
    public void setDimension(Dimension dimension) {
        this.dimension = dimension;
    }

    /**
     * @return the alto
     */
    public Double getAlto() {
        return alto;
    }

    /**
     * @param alto the alto to set
     */
    public void setAlto(Double alto) {
        this.alto = alto;
    }

    /**
     * @return the ancho
     */
    public Double getAncho() {
        return ancho;
    }

    /**
     * @param ancho the ancho to set
     */
    public void setAncho(Double ancho) {
        this.ancho = ancho;
    }

    /**
     * @return the profundidad
     */
    public Double getProfundidad() {
        return profundidad;
    }

    /**
     * @param profundidad the profundidad to set
     */
    public void setProfundidad(Double profundidad) {
        this.profundidad = profundidad;
    }

    /**
     * @return the color
     */
    public String getColor() {
        return color;
    }

    /**
     * @param color the color to set
     */
    public void setColor(String color) {
        this.color = color;
    }

    /**
     * @return the peso
     */
    public Double getPeso() {
        return peso;
    }

    /**
     * @param peso the peso to set
     */
    public void setPeso(Double peso) {
        this.peso = peso;
    }

    /**
     * @return the bytesFoto
     */
    public byte[] getBytesFoto() {
        return bytesFoto;
    }

    /**
     * @param bytesFoto the bytesFoto to set
     */
    public void setBytesFoto(byte[] bytesFoto) {
        this.bytesFoto = bytesFoto;
    }

    /**
     * @return the foto
     */
    public List<UploadItem> getFoto() {
        return foto;
    }

    /**
     * @param foto the foto to set
     */
    public void setFoto(List<UploadItem> foto) {
        this.foto = foto;
    }

    /**
     * @return the fotoMueble
     */
    public UploadItem getFotoMueble() {
        return fotoMueble;
    }

    /**
     * @param fotoMueble the fotoMueble to set
     */
    public void setFotoMueble(UploadItem fotoMueble) {
        this.fotoMueble = fotoMueble;
    }

    /**
     * @return the colorItems
     */
    public List<SelectItem> getColorItems() {
        return colorItems;
    }

    /**
     * @param colorItems the colorItems to set
     */
    public void setColorItems(List<SelectItem> colorItems) {
        this.colorItems = colorItems;
    }

    /**
     * @return the productoService
     */
    public IProductoService getProductoService() {
        return productoService;
    }

    /**
     * @param productoService the productoService to set
     */
    public void setProductoService(IProductoService productoService) {
        this.productoService = productoService;
    }

    /**
     * @return the LIST
     */
    public static String getLIST() {
        return LIST;
    }

    /**
     * @param aLIST the LIST to set
     */
    public static void setLIST(String aLIST) {
        LIST = aLIST;
    }

    /**
     * @return the nombreFoto
     */
    public String getNombreFoto() {
        return nombreFoto;
    }

    /**
     * @param nombreFoto the nombreFoto to set
     */
    public void setNombreFoto(String nombreFoto) {
        this.nombreFoto = nombreFoto;
    }

    

}
